package com.hy.video.monitor.security.userdetails;

import com.hy.video.monitor.repository.UserRepo;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsPasswordService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @program: ca
 * @description TODO 密码升级：实现UserDetailsPasswordService中updatePassword
 * 		        TODO 登录成功后能拿到用户的原始明文密码是吧，再按照最新的默认编码格式存储上，
 * 		        TODO 然后再把这个密码的Hash存到数据库里面。
 * @author: 张三少
 * @create: 2022-04-20 10:58
 **/
@Transactional
@RequiredArgsConstructor
@Service
public class UserDetailsPasswordServiceImpl implements UserDetailsPasswordService {

    private final UserRepo userRepo;

    /**
     * 重写updatePassword方法，指定自己的更新密码方案
     * @param user
     * @param newPassword 系统已经用新的编码 Hash 过的密码
     * @return
     */
    @Override
    public UserDetails updatePassword(UserDetails user, String newPassword) {
        return userRepo.findOptionalByUsername(user.getUsername())
            // userFromDb.withPassword(newPassword) 修改完值会返回一个新的对象
            .map(userFromDb -> userRepo.save(userFromDb.withPassword(newPassword)))
            .orElseThrow();   // orElseThrow: 处理查询结果为空
    }
}
